Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


nomadnet/vendor/additional_urwid_widgets/widgets/date_picker.py master (89e3eea1) Text, 19.36 KB

T8b949e#! /usr/bin/env python3
T8b949e# -*- coding: utf-8 -*-


Tff7b72from T7ee787.T7ee787.T7ee787assisting_modulesT7ee787.T7ee787modifier_key Tff7b72import Te6edf3MODIFIER_KEY T8b949e# pylint: disable=unused-import
Tff7b72from T7ee787.T7ee787.T7ee787assisting_modulesT7ee787.T7ee787useful_functions Tff7b72import Te6edf3recursively_replace
Tff7b72from T7ee787.T7ee787indicative_listbox Tff7b72import Te6edf3IndicativeListBox
Tff7b72from T7ee787.T7ee787integer_picker Tff7b72import Te6edf3IntegerPicker
Tff7b72from T7ee787.T7ee787selectable_row Tff7b72import Te6edf3SelectableRow

Tff7b72import T7ee787calendar
Tff7b72import T7ee787datetime
Tff7b72import T7ee787enum
Tff7b72import T7ee787urwid


Tff7b72class T56d364DatePickerTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
T8b949e"""Serves as a selector for dates."""
Te6edf3_TYPE_ERR_MSG Tff7b72= Ta5d6ff"Ta5d6fftype Tffd700{}Ta5d6ff was expected for Tffd700{}Ta5d6ff, but found: Tffd700{}Ta5d6ff.Ta5d6ff"
Te6edf3_VALUE_ERR_MSG Tff7b72= Ta5d6ff"Ta5d6ffunrecognized value: Tffd700{}Ta5d6ff.Ta5d6ff"

T8b949e# These values are interpreted during the creation of the list items for the day picker.
Tff7b72class T56d364DAY_FORMATTb4b4b4(Te6edf3enumTff7b72.Td2a8ffEnumTb4b4b4)Tb4b4b4:
Te6edf3DAY_OF_MONTH Tff7b72= T79c0ff1
Te6edf3DAY_OF_MONTH_TWO_DIGIT Tff7b72= T79c0ff2
Te6edf3WEEKDAY Tff7b72= T79c0ff3
T8b949e# These values are interpreted during the initialization and define the arrangement of the pickers.
Tff7b72class T56d364PICKERTb4b4b4(Te6edf3enumTff7b72.Td2a8ffEnumTb4b4b4)Tb4b4b4:
Te6edf3YEAR Tff7b72= T79c0ff1
Te6edf3MONTH Tff7b72= T79c0ff2
Te6edf3DAY Tff7b72= T79c0ff3
T8b949e# Specifies which dates are selectable.
Tff7b72class T56d364RANGETb4b4b4(Te6edf3enumTff7b72.Td2a8ffEnumTb4b4b4)Tb4b4b4:
Te6edf3ALL Tff7b72= T79c0ff1
Te6edf3ONLY_PAST Tff7b72= T79c0ff2
Te6edf3ONLY_FUTURE Tff7b72= T79c0ff3
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3initial_dateTff7b72=Te6edf3datetimeTff7b72.Td2a8ffdateTff7b72.Td2a8fftodayTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72*Tb4b4b4, Te6edf3date_rangeTff7b72=Te6edf3RANGETff7b72.Td2a8ffALLTb4b4b4, Te6edf3month_namesTff7b72=Te6edf3calendarTff7b72.Td2a8ffmonth_nameTb4b4b4, Te6edf3day_namesTff7b72=Te6edf3calendarTff7b72.Td2a8ffday_abbrTb4b4b4,
Te6edf3day_formatTff7b72=Tb4b4b4(Te6edf3DAY_FORMATTff7b72.Td2a8ffWEEKDAYTb4b4b4, Te6edf3DAY_FORMATTff7b72.Td2a8ffDAY_OF_MONTHTb4b4b4)Tb4b4b4, Te6edf3columnsTff7b72=Tb4b4b4(Te6edf3PICKERTff7b72.Td2a8ffDAYTb4b4b4, Te6edf3PICKERTff7b72.Td2a8ffMONTHTb4b4b4, Te6edf3PICKERTff7b72.Td2a8ffYEARTb4b4b4)Tb4b4b4,
Te6edf3modifier_keyTff7b72=Te6edf3MODIFIER_KEYTff7b72.Td2a8ffCTRLTb4b4b4, Te6edf3return_unused_navigation_inputTff7b72=Tff7b72FalseTb4b4b4, Te6edf3year_jump_lenTff7b72=T79c0ff50Tb4b4b4, Te6edf3space_betweenTff7b72=T79c0ff2Tb4b4b4,
Te6edf3min_width_each_pickerTff7b72=T79c0ff9Tb4b4b4, Te6edf3year_alignTff7b72=Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4, Te6edf3month_alignTff7b72=Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4, Te6edf3day_alignTff7b72=Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4, Te6edf3topBar_alignTff7b72=Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4,
Te6edf3topBar_endCovered_propTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ff▲Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4, Te6edf3topBar_endExposed_propTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ff───Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4, Te6edf3bottomBar_alignTff7b72=Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4,
Te6edf3bottomBar_endCovered_propTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ff▼Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4, Te6edf3bottomBar_endExposed_propTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ff───Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4, Te6edf3highlight_propTff7b72=Tb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72assert Tb4b4b4(Tffa657typeTb4b4b4(Te6edf3date_rangeTb4b4b4) Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ff_TYPE_ERR_MSGTff7b72.Td2a8ffformatTb4b4b4(Ta5d6ff"Ta5d6ff<enum Ta5d6ff'Ta5d6ffDatePicker.RANGETa5d6ff'Ta5d6ff>Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff'Ta5d6ffdate_rangeTa5d6ff'Ta5d6ff"Tb4b4b4,
Tffa657typeTb4b4b4(Te6edf3date_rangeTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3df Tff7b72in Te6edf3day_formatTb4b4b4:
Tff7b72assert Tb4b4b4(Tffa657typeTb4b4b4(Te6edf3dfTb4b4b4) Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffDAY_FORMATTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ff_TYPE_ERR_MSGTff7b72.Td2a8ffformatTb4b4b4(Ta5d6ff"Ta5d6ff<enum Ta5d6ff'Ta5d6ffDatePicker.DAY_FORMATTa5d6ff'Ta5d6ff>Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffall elements of Ta5d6ff'Ta5d6ffday_formatTa5d6ff'Ta5d6ff"Tb4b4b4,
Tffa657typeTb4b4b4(Te6edf3dfTb4b4b4)Tb4b4b4)
T8b949e# Relevant for 'RANGE.ONLY_PAST' and 'RANGE.ONLY_FUTURE' to limit the respective choices.
Tff7b72selfTff7b72.Td2a8ff_initial_year Tff7b72= Te6edf3initial_dateTff7b72.Td2a8ffyear
Tff7b72selfTff7b72.Td2a8ff_initial_month Tff7b72= Te6edf3initial_dateTff7b72.Td2a8ffmonth
Tff7b72selfTff7b72.Td2a8ff_initial_day Tff7b72= Te6edf3initial_dateTff7b72.Td2a8ffday
T8b949e# The date pool can be limited, so that only past or future dates are selectable. The initial date is included in the
T8b949e# pool.
Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72= Te6edf3date_range
T8b949e# The presentation of months and weekdays can be changed by passing alternative values (e.g. abbreviations or numerical
T8b949e# representations).
Tff7b72selfTff7b72.Td2a8ff_month_names Tff7b72= Te6edf3month_names
Tff7b72selfTff7b72.Td2a8ff_day_names Tff7b72= Te6edf3day_names
T8b949e# Since there are different needs regarding the appearance of the day picker, an iterable can be passed, which allows a
T8b949e# customization of the presentation.
Tff7b72selfTff7b72.Td2a8ff_day_format Tff7b72= Te6edf3day_format
T8b949e# Specifies the text alignment of the individual pickers. The year alignment is passed directly to the year picker.
Tff7b72selfTff7b72.Td2a8ff_month_align Tff7b72= Te6edf3month_align
Tff7b72selfTff7b72.Td2a8ff_day_align Tff7b72= Te6edf3day_align
T8b949e# The default style of a list entry. Since only one list entry will be visible at a time and there is also off focus
T8b949e# highlighting, the normal value can be 'None' (it is never shown).
Tff7b72selfTff7b72.Td2a8ff_item_attr Tff7b72= Tb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3highlight_propTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
T8b949e# A full list of months. (From 'January' to 'December'.)
Tff7b72selfTff7b72.Td2a8ff_month_list Tff7b72= Tff7b72selfTff7b72.Td2a8ff_generate_monthsTb4b4b4(Tb4b4b4)
T8b949e# Set the respective values depending on the date range.
Te6edf3min_year Tff7b72= Te6edf3datetimeTff7b72.Td2a8ffMINYEAR
Te6edf3max_year Tff7b72= Te6edf3datetimeTff7b72.Td2a8ffMAXYEAR
Te6edf3month_position Tff7b72= Tff7b72selfTff7b72.Td2a8ff_initial_month Tff7b72- T79c0ff1
Te6edf3day_position Tff7b72= Tff7b72selfTff7b72.Td2a8ff_initial_day Tff7b72- T79c0ff1
Tff7b72if Te6edf3date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffALLTb4b4b4:
Te6edf3initial_month_list Tff7b72= Tff7b72selfTff7b72.Td2a8ff_month_list
Tff7b72elif Te6edf3date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_PASTTb4b4b4:
Te6edf3max_year Tff7b72= Tff7b72selfTff7b72.Td2a8ff_initial_year
T8b949e# The months of the very last year may be shorten.
Tff7b72selfTff7b72.Td2a8ff_shortened_month_list Tff7b72= Tff7b72selfTff7b72.Td2a8ff_generate_monthsTb4b4b4(Te6edf3endTff7b72=Tff7b72selfTff7b72.Td2a8ff_initial_monthTb4b4b4)
Te6edf3initial_month_list Tff7b72= Tff7b72selfTff7b72.Td2a8ff_shortened_month_list
Tff7b72elif Te6edf3date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_FUTURETb4b4b4:
Te6edf3min_year Tff7b72= Tff7b72selfTff7b72.Td2a8ff_initial_year
T8b949e# The months of the very first year may be shorten.
Tff7b72selfTff7b72.Td2a8ff_shortened_month_list Tff7b72= Tff7b72selfTff7b72.Td2a8ff_generate_monthsTb4b4b4(Te6edf3startTff7b72=Tff7b72selfTff7b72.Td2a8ff_initial_monthTb4b4b4)
Te6edf3initial_month_list Tff7b72= Tff7b72selfTff7b72.Td2a8ff_shortened_month_list
T8b949e# The list may not start at 1 but some other day of month, therefore use the first list item.
Te6edf3month_position Tff7b72= T79c0ff0
Te6edf3day_position Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ff_VALUE_ERR_MSGTff7b72.Td2a8ffformatTb4b4b4(Te6edf3date_rangeTb4b4b4)Tb4b4b4)
T8b949e# Create pickers.
Tff7b72selfTff7b72.Td2a8ff_year_picker Tff7b72= Te6edf3IntegerPickerTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4,
Te6edf3min_vTff7b72=Te6edf3min_yearTb4b4b4,
Te6edf3max_vTff7b72=Te6edf3max_yearTb4b4b4,
Te6edf3jump_lenTff7b72=Te6edf3year_jump_lenTb4b4b4,
Te6edf3on_selection_changeTff7b72=Tff7b72selfTff7b72.Td2a8ff_year_has_changedTb4b4b4,
Te6edf3modifier_keyTff7b72=Te6edf3modifier_keyTb4b4b4,
Te6edf3return_unused_navigation_inputTff7b72=Te6edf3return_unused_navigation_inputTb4b4b4,
Te6edf3topBar_alignTff7b72=Te6edf3topBar_alignTb4b4b4,
Te6edf3topBar_endCovered_propTff7b72=Te6edf3topBar_endCovered_propTb4b4b4,
Te6edf3topBar_endExposed_propTff7b72=Te6edf3topBar_endExposed_propTb4b4b4,
Te6edf3bottomBar_alignTff7b72=Te6edf3bottomBar_alignTb4b4b4,
Te6edf3bottomBar_endCovered_propTff7b72=Te6edf3bottomBar_endCovered_propTb4b4b4,
Te6edf3bottomBar_endExposed_propTff7b72=Te6edf3bottomBar_endExposed_propTb4b4b4,
Te6edf3display_syntaxTff7b72=Ta5d6ff"Tffd700{:04}Ta5d6ff"Tb4b4b4,
Te6edf3display_alignTff7b72=Te6edf3year_alignTb4b4b4,
Te6edf3display_propTff7b72=Te6edf3highlight_propTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_month_picker Tff7b72= Te6edf3IndicativeListBoxTb4b4b4(Te6edf3initial_month_listTb4b4b4,
Te6edf3positionTff7b72=Te6edf3month_positionTb4b4b4,
Te6edf3on_selection_changeTff7b72=Tff7b72selfTff7b72.Td2a8ff_month_has_changedTb4b4b4,
Te6edf3modifier_keyTff7b72=Te6edf3modifier_keyTb4b4b4,
Te6edf3return_unused_navigation_inputTff7b72=Te6edf3return_unused_navigation_inputTb4b4b4,
Te6edf3topBar_alignTff7b72=Te6edf3topBar_alignTb4b4b4,
Te6edf3topBar_endCovered_propTff7b72=Te6edf3topBar_endCovered_propTb4b4b4,
Te6edf3topBar_endExposed_propTff7b72=Te6edf3topBar_endExposed_propTb4b4b4,
Te6edf3bottomBar_alignTff7b72=Te6edf3bottomBar_alignTb4b4b4,
Te6edf3bottomBar_endCovered_propTff7b72=Te6edf3bottomBar_endCovered_propTb4b4b4,
Te6edf3bottomBar_endExposed_propTff7b72=Te6edf3bottomBar_endExposed_propTb4b4b4,
Te6edf3highlight_offFocusTff7b72=Te6edf3highlight_propTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_day_picker Tff7b72= Te6edf3IndicativeListBoxTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_generate_daysTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_initial_monthTb4b4b4)Tb4b4b4,
Te6edf3positionTff7b72=Te6edf3day_positionTb4b4b4,
Te6edf3modifier_keyTff7b72=Te6edf3modifier_keyTb4b4b4,
Te6edf3return_unused_navigation_inputTff7b72=Te6edf3return_unused_navigation_inputTb4b4b4,
Te6edf3topBar_alignTff7b72=Te6edf3topBar_alignTb4b4b4,
Te6edf3topBar_endCovered_propTff7b72=Te6edf3topBar_endCovered_propTb4b4b4,
Te6edf3topBar_endExposed_propTff7b72=Te6edf3topBar_endExposed_propTb4b4b4,
Te6edf3bottomBar_alignTff7b72=Te6edf3bottomBar_alignTb4b4b4,
Te6edf3bottomBar_endCovered_propTff7b72=Te6edf3bottomBar_endCovered_propTb4b4b4,
Te6edf3bottomBar_endExposed_propTff7b72=Te6edf3bottomBar_endExposed_propTb4b4b4,
Te6edf3highlight_offFocusTff7b72=Te6edf3highlight_propTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
T8b949e# To mimic a selection widget, 'IndicativeListbox' is wrapped in a 'urwid.BoxAdapter'. Since two rows are used for the bars,
T8b949e# size 3 makes exactly one list item visible.
Te6edf3boxed_month_picker Tff7b72= Te6edf3urwidTff7b72.Td2a8ffBoxAdapterTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_month_pickerTb4b4b4, T79c0ff3Tb4b4b4)
Te6edf3boxed_day_picker Tff7b72= Te6edf3urwidTff7b72.Td2a8ffBoxAdapterTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_day_pickerTb4b4b4, T79c0ff3Tb4b4b4)
T8b949e# Replace the 'DatePicker.PICKER' elements of the parameter 'columns' with the corresponding pickers.
Te6edf3replacements Tff7b72= Tb4b4b4{Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffPICKERTff7b72.Td2a8ffYEAR Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_year_pickerTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffPICKERTff7b72.Td2a8ffMONTH Tb4b4b4: Te6edf3boxed_month_pickerTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffPICKERTff7b72.Td2a8ffDAY Tb4b4b4: Te6edf3boxed_day_pickerTb4b4b4}
Te6edf3columns Tff7b72= Te6edf3recursively_replaceTb4b4b4(Te6edf3columnsTb4b4b4, Te6edf3replacementsTb4b4b4)
T8b949e# wrap 'urwid.Columns'
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Te6edf3urwidTff7b72.Td2a8ffColumnsTb4b4b4(Te6edf3columnsTb4b4b4,
Te6edf3min_widthTff7b72=Te6edf3min_width_each_pickerTb4b4b4,
Te6edf3dividecharsTff7b72=Te6edf3space_betweenTb4b4b4)Tb4b4b4)
Tff7b72def Tff7b72__repr__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700{}Ta5d6ff(date=Ta5d6ff'Tffd700{}Ta5d6ff'Ta5d6ff, date_range=Ta5d6ff'Tffd700{}Ta5d6ff'Ta5d6ff, initial_date=Ta5d6ff'Tffd700{}Ta5d6ff-Tffd700{:02}Ta5d6ff-Tffd700{:02}Ta5d6ff'Ta5d6ff, selected_date=Ta5d6ff'Tffd700{}Ta5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ff__name__Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffget_dateTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_date_rangeTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_initial_monthTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_initial_dayTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffget_dateTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e# The returned widget is used for all list entries.
Tff7b72def Td2a8ff_generate_itemTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3colsTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3alignTff7b72=Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3SelectableRowTb4b4b4(Te6edf3colsTb4b4b4, Te6edf3alignTff7b72=Te6edf3alignTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_item_attrTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_item_attrTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ff_generate_monthsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3startTff7b72=T79c0ff1Tb4b4b4, Te6edf3endTff7b72=T79c0ff12Tb4b4b4)Tb4b4b4:
Te6edf3months Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3month Tff7b72in Tffa657rangeTb4b4b4(Te6edf3startTb4b4b4, Te6edf3endTff7b72+T79c0ff1Tb4b4b4)Tb4b4b4:
Te6edf3item Tff7b72= Tff7b72selfTff7b72.Td2a8ff_generate_itemTb4b4b4(Tb4b4b4[Tff7b72selfTff7b72.Td2a8ff_month_namesTb4b4b4[Te6edf3monthTb4b4b4]Tb4b4b4]Tb4b4b4, Te6edf3alignTff7b72=Tff7b72selfTff7b72.Td2a8ff_month_alignTb4b4b4)
T8b949e# Add a new instance variable which holds the numerical value. This makes it easier to get the displayed value.
Te6edf3itemTff7b72.Td2a8ff_numerical_value Tff7b72= Te6edf3month
Te6edf3monthsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3itemTb4b4b4)
Tff7b72return Te6edf3months
Tff7b72def Td2a8ff_generate_daysTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3yearTb4b4b4, Te6edf3monthTb4b4b4)Tb4b4b4:
Te6edf3start Tff7b72= T79c0ff1
Te6edf3weekdayTb4b4b4, Te6edf3end Tff7b72= Te6edf3calendarTff7b72.Td2a8ffmonthrangeTb4b4b4(Te6edf3yearTb4b4b4, Te6edf3monthTb4b4b4) T8b949e# end is included in the range
T8b949e# If the date range is 'ONLY_PAST', the last month does not end as usual but on the specified day.
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_PASTTb4b4b4) Tff7b72and Tb4b4b4(Te6edf3year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4) Tff7b72and Tb4b4b4(Te6edf3month Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_monthTb4b4b4)Tb4b4b4:
Te6edf3end Tff7b72= Tff7b72selfTff7b72.Td2a8ff_initial_day
T8b949e# If the date range is 'ONLY_FUTURE', the first month does not start as usual but on the specified day.
Tff7b72elif Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_FUTURETb4b4b4) Tff7b72and Tb4b4b4(Te6edf3year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4) Tff7b72and Tb4b4b4(Te6edf3month Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_monthTb4b4b4)Tb4b4b4:
Te6edf3start Tff7b72= Tff7b72selfTff7b72.Td2a8ff_initial_day
Te6edf3weekday Tff7b72= Te6edf3calendarTff7b72.Td2a8ffweekdayTb4b4b4(Te6edf3yearTb4b4b4, Te6edf3monthTb4b4b4, Te6edf3startTb4b4b4)
Te6edf3days Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3day Tff7b72in Tffa657rangeTb4b4b4(Te6edf3startTb4b4b4, Te6edf3endTff7b72+T79c0ff1Tb4b4b4)Tb4b4b4:
Te6edf3cols Tff7b72= Tb4b4b4[Tb4b4b4]
T8b949e# The 'DatePicker.DAY_FORMAT' elements of the iterable are translated into columns of the day picker. This allows the
T8b949e# presentation to be customized.
Tff7b72for Te6edf3df Tff7b72in Tff7b72selfTff7b72.Td2a8ff_day_formatTb4b4b4:
Tff7b72if Te6edf3df Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffDAY_FORMATTff7b72.Td2a8ffDAY_OF_MONTHTb4b4b4:
Te6edf3colsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3dayTb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3df Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffDAY_FORMATTff7b72.Td2a8ffDAY_OF_MONTH_TWO_DIGITTb4b4b4:
Te6edf3colsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3dayTb4b4b4)Tff7b72.Td2a8ffzfillTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3df Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffDAY_FORMATTff7b72.Td2a8ffWEEKDAYTb4b4b4:
Te6edf3colsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_day_namesTb4b4b4[Te6edf3weekdayTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ff_VALUE_ERR_MSGTff7b72.Td2a8ffformatTb4b4b4(Te6edf3dfTb4b4b4)Tb4b4b4)
Te6edf3item Tff7b72= Tff7b72selfTff7b72.Td2a8ff_generate_itemTb4b4b4(Te6edf3colsTb4b4b4, Te6edf3alignTff7b72=Tff7b72selfTff7b72.Td2a8ff_day_alignTb4b4b4)
T8b949e# Add a new instance variable which holds the numerical value. This makes it easier to get the displayed value.
Te6edf3itemTff7b72.Td2a8ff_numerical_value Tff7b72= Te6edf3day
T8b949e# Keeps track of the weekday.
Te6edf3weekday Tff7b72= Tb4b4b4(Te6edf3weekday Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72if Tb4b4b4(Te6edf3weekday Tff7b72< T79c0ff6Tb4b4b4) Tff7b72else T79c0ff0
Te6edf3daysTff7b72.Td2a8ffappendTb4b4b4(Te6edf3itemTb4b4b4)
Tff7b72return Te6edf3days
Tff7b72def Td2a8ff_year_has_changedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3previous_yearTb4b4b4, Te6edf3current_yearTb4b4b4)Tb4b4b4:
Te6edf3month_position_before_change Tff7b72= Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffget_selected_positionTb4b4b4(Tb4b4b4)
T8b949e# Since there are no years in 'RANGE.ALL' that do not have the full month range, the body never needs to be changed after
T8b949e# initialization.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72!= Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffALLTb4b4b4:
T8b949e# 'None' stands for trying to keep the old value.
Te6edf3provisional_position Tff7b72= Tff7b72None
T8b949e# If the previous year was the specified year, the shortened month range must be replaced by the complete one. If this
T8b949e# shortened month range does not begin at 'January', then the difference must be taken into account.
Tff7b72if Te6edf3previous_year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_FUTURETb4b4b4:
Te6edf3provisional_position Tff7b72= Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffget_selected_itemTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_numerical_value Tff7b72- T79c0ff1
Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffset_bodyTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_month_listTb4b4b4,
Te6edf3alternative_positionTff7b72=Te6edf3provisional_positionTb4b4b4)
T8b949e# If the specified year is selected, the full month range must be replaced with the shortened one.
Tff7b72elif Te6edf3current_year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_FUTURETb4b4b4:
Te6edf3provisional_position Tff7b72= Te6edf3month_position_before_change Tff7b72- Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_initial_month Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffset_bodyTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_shortened_month_listTb4b4b4,
Te6edf3alternative_positionTff7b72=Te6edf3provisional_positionTb4b4b4)
T8b949e# Since the month has changed, the corresponding method is called.
Tff7b72selfTff7b72.Td2a8ff_month_has_changedTb4b4b4(Te6edf3month_position_before_changeTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffget_selected_positionTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3previous_yearTff7b72=Te6edf3previous_yearTb4b4b4)
Tff7b72def Td2a8ff_month_has_changedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3previous_positionTb4b4b4, Te6edf3current_positionTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3previous_yearTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e# 'None' stands for trying to keep the old value.
Te6edf3provisional_position Tff7b72= Tff7b72None
Te6edf3current_year Tff7b72= Tff7b72selfTff7b72.Td2a8ff_year_pickerTff7b72.Td2a8ffget_valueTb4b4b4(Tb4b4b4)
T8b949e# Out of range values are changed by 'IndicativeListBox' to the nearest valid values.
T8b949e# If the date range is 'ONLY_FUTURE', it may be that a month does not start on the first day. In this case, the value must
T8b949e# be changed to reflect this difference.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_FUTURETb4b4b4:
T8b949e# If the current or previous year is the specified year and the month was the specified month, the value has an offset
T8b949e# of the specified day. Therefore the deposited numerical value is used. ('-1' because it's an index.)
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3current_year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4) Tff7b72or Tb4b4b4(Te6edf3previous_year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4)Tb4b4b4) Tff7b72and Tb4b4b4(Te6edf3previous_position Tff7b72== T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3provisional_position Tff7b72= Tff7b72selfTff7b72.Td2a8ff_day_pickerTff7b72.Td2a8ffget_selected_itemTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_numerical_value Tff7b72- T79c0ff1
T8b949e# If the current year is the specified year and the current month is the specified month, the month begins not with
T8b949e# the first day, but with the specified day.
Tff7b72elif Tb4b4b4(Te6edf3current_year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4) Tff7b72and Tb4b4b4(Te6edf3current_position Tff7b72== T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3provisional_position Tff7b72= Tff7b72selfTff7b72.Td2a8ff_day_pickerTff7b72.Td2a8ffget_selected_positionTb4b4b4(Tb4b4b4) Tff7b72- Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_initial_day Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_day_pickerTff7b72.Td2a8ffset_bodyTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_generate_daysTb4b4b4(Te6edf3current_yearTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffget_selected_itemTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_numerical_valueTb4b4b4)Tb4b4b4,
Te6edf3alternative_positionTff7b72=Te6edf3provisional_positionTb4b4b4)
Tff7b72def Td2a8ffget_dateTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3datetimeTff7b72.Td2a8ffdateTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_year_pickerTff7b72.Td2a8ffget_valueTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffget_selected_itemTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_numerical_valueTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_day_pickerTff7b72.Td2a8ffget_selected_itemTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_numerical_valueTb4b4b4)
Tff7b72def Td2a8ffset_dateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dateTb4b4b4)Tb4b4b4:
T8b949e# If the date range is limited, test for the new limit.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72!= Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffALLTb4b4b4:
Te6edf3limit Tff7b72= Te6edf3datetimeTff7b72.Td2a8ffdateTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_initial_monthTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_initial_dayTb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_PASTTb4b4b4) Tff7b72and Tb4b4b4(Te6edf3date Tff7b72> Te6edf3limitTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffThe passed date is outside the upper bound of the date range.Ta5d6ff"Tb4b4b4)
Tff7b72elif Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_FUTURETb4b4b4) Tff7b72and Tb4b4b4(Te6edf3date Tff7b72< Te6edf3limitTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffThe passed date is outside the lower bound of the date range.Ta5d6ff"Tb4b4b4)
Te6edf3year Tff7b72= Te6edf3dateTff7b72.Td2a8ffyear
Te6edf3month Tff7b72= Te6edf3dateTff7b72.Td2a8ffmonth
Te6edf3day Tff7b72= Te6edf3dateTff7b72.Td2a8ffday
T8b949e# Set the new values, if needed.
Tff7b72if Te6edf3year Tff7b72!= Tff7b72selfTff7b72.Td2a8ff_year_pickerTff7b72.Td2a8ffget_valueTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_year_pickerTff7b72.Td2a8ffset_valueTb4b4b4(Te6edf3yearTb4b4b4)
Tff7b72if Te6edf3month Tff7b72!= Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffget_selected_itemTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_numerical_valueTb4b4b4:
Te6edf3month_position Tff7b72= Te6edf3month Tff7b72- T79c0ff1 T8b949e# '-1' because it's an index.
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_FUTURETb4b4b4) Tff7b72and Tb4b4b4(Te6edf3year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4)Tb4b4b4:
T8b949e# If the value should be negative, the behavior of 'IndicativeListBox' shows effect and position 0 is selected.
Te6edf3month_position Tff7b72= Te6edf3month_position Tff7b72- Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_initial_month Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_month_pickerTff7b72.Td2a8ffselect_itemTb4b4b4(Te6edf3month_positionTb4b4b4)
Tff7b72if Te6edf3day Tff7b72!= Tff7b72selfTff7b72.Td2a8ff_day_pickerTff7b72.Td2a8ffget_selected_itemTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_numerical_valueTb4b4b4:
Te6edf3day_position Tff7b72= Te6edf3day Tff7b72- T79c0ff1 T8b949e# '-1' because it's an index.
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_date_range Tff7b72== Tff7b72selfTff7b72.Td2a8ff__class__Tff7b72.Td2a8ffRANGETff7b72.Td2a8ffONLY_FUTURETb4b4b4) Tff7b72and Tb4b4b4(Te6edf3year Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_yearTb4b4b4) Tff7b72and Tb4b4b4(Te6edf3month Tff7b72== Tff7b72selfTff7b72.Td2a8ff_initial_monthTb4b4b4)Tb4b4b4:
Te6edf3day_position Tff7b72= Te6edf3day_position Tff7b72- Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_initial_day Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_day_pickerTff7b72.Td2a8ffselect_itemTb4b4b4(Te6edf3day_positionTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────